﻿using System.Collections.Generic;
using NHibernate;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioProtocoloProcedimento : IRepositorioProtocoloProcedimento
    {
        public ProtocoloProcedimento Inserir(ProtocoloProcedimento protocoloProcedimento)
        {
            foreach (ProcedimentoSituacaoTramite procedimentoSituacaoTramite in protocoloProcedimento.ListaProcedimentoSituacaoTramite)
            {
                procedimentoSituacaoTramite.ProtocoloProcedimento = protocoloProcedimento;
            }

            GerenciadorBDConfigs.Instance.SessaoAtual().Save(protocoloProcedimento);
            return protocoloProcedimento;
        }

        public ProtocoloProcedimento Atualizar(ProtocoloProcedimento protocoloProcedimento)
        {
            ProtocoloProcedimento tmpProtocoloProcedimento = ObterPorId(protocoloProcedimento.AssuntoProcedimentoId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpProtocoloProcedimento.DataConclusao = protocoloProcedimento.DataConclusao.HasValue
                                                ? protocoloProcedimento.DataConclusao.GetValueOrDefault()
                                                : protocoloProcedimento.DataConclusao;
            tmpProtocoloProcedimento.DataVencimento = protocoloProcedimento.DataVencimento.HasValue
                                                ? protocoloProcedimento.DataVencimento.GetValueOrDefault()
                                                : protocoloProcedimento.DataVencimento;
            tmpProtocoloProcedimento.Protocolo = protocoloProcedimento.Protocolo;
            tmpProtocoloProcedimento.ListaProcedimentoSituacaoTramite.Clear();
            foreach (ProcedimentoSituacaoTramite procedimentoSituacaoTramite in protocoloProcedimento.ListaProcedimentoSituacaoTramite)
            {
                tmpProtocoloProcedimento.AdicionarProcedimentoSituacaoTramite(procedimentoSituacaoTramite);
            }

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpProtocoloProcedimento);
            return tmpProtocoloProcedimento;
        }

        public void Excluir(ProtocoloProcedimento protocoloProcedimento)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(protocoloProcedimento);
        }

        public IList<ProtocoloProcedimento> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(ProtocoloProcedimento));
            return criteria.List<ProtocoloProcedimento>() as List<ProtocoloProcedimento>;
        }

        public ProtocoloProcedimento ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<ProtocoloProcedimento>(id);
        }
    }
}